<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>手写板绘制</title>
    <style>
        .canvas {
            border: 1px solid rgb(170, 170, 170);
            cursor: pointer;
        }

        .mgTop {
            margin-top: 30px;
            text-align: center;
        }
    </style>
    <script src="../js/fabric.min.js"></script>
</head>

<body style="padding-left: 10px;text-align:center;">

    <h1>手写板测试</h1>

    <div class="mgTop">
        <canvas width="1880" height="1329" id="freeCanvas" class="canvas"></canvas>
    </div>

    <button style="display: none;" onclick="toData()"> 转换 </button>

    <button onclick="clearCanvas()"> 清空画板 </button>

    <script>
        var canvas = new fabric.Canvas("freeCanvas", {
            isDrawingMode: true,
            selection: false,
            width: 1880,
            height: 1329
        });

        window.open("http://cmd.com/setpadcanvas?" + canvas.width + "&" + canvas.height);

        function toData() {
            console.log(canvas.toJSON());
            console.log(drawingPath.path);
        }

        var invalidCoord = -1000000; //无效的坐标值
        var prevX = invalidCoord, prevY = invalidCoord; //绘制中上一个节点的x,y
        var drawingIndex = 0; //绘制对象的下标
        var drawingPath = undefined;
        var drawColor = '#E34F51',
            strokeWidth = 2,
            tempCount = 0;

        //手写板绘制 type:M=>开始绘制 Q=>绘制中 L=>结束绘制
        function writingPad(type, x, y) {

            // window.open("http://cmd.com/WriteLog?writingPad—type:" + type + " x:" + x + " y:" + y);

            if (type) {
                switch (type.toLowerCase()) {
                    case 'm':
                        //开始绘制
                        drawingPath = new fabric.Path('M ' + x + ' ' + y + ' ', {
                            stroke: drawColor,
                            fill: "rgba(255, 255, 255, 0)",
                            strokeWidth: strokeWidth
                        });
                        canvas.add(drawingPath);
                        break;
                    case 'q':
                        //绘制中
                        if (drawingPath) {
                            if (prevX == invalidCoord || prevY == invalidCoord) {
                                prevX = x, prevY = y;
                            } else {
                                ++tempCount;
                                if (tempCount % 2) {
                                    drawingPath.path.push(["Q", prevX, prevY, x, y]);
                                    var _path = drawingPath.path;
                                    canvas.remove(_path); //先移除
                                    //再添加（变相实现更新）
                                    drawingPath = new fabric.Path(_path, {
                                        stroke: drawColor,
                                        fill: "rgba(255, 255, 255, 0)",
                                        strokeWidth: strokeWidth
                                    });
                                    canvas.add(drawingPath);
                                    prevX = invalidCoord, prevY = invalidCoord;

                                    // window.open("http://cmd.com/WriteLog?drawingPath—type:" + type + " x:" + x + " y:" + y);

                                }
                            }
                        } else {
                            alert('绘制失败：画板异常，请重新连接画板重试！');
                        }
                        break;
                    case 'l':
                        //结束绘制
                        drawingPath.path.push(["L", x, y]);
                        // canvas.loadFromJSON(canvas.toJSON());
                        drawingPath = undefined;
                        prevX = invalidCoord, prevY = invalidCoord;
                        tempCount = 0;
                        break;
                    default:
                        break;
                }
            }
        }

        function clearCanvas() {
            canvas.clear();
        }

    </script>
</body>

</html>